package main

import (
	"encoding/json"
	"fmt"
	"reflect"
)

// 定义结构体数据对象
type student struct {
	Id int
	Name string
}

// 生成结构体对象的方法
func newStudent(id int, name string) student {
	return student{
		Id: id,
		Name: name,
	}
}


// 数据组装形式
type class struct {
	Title string
	Students []student
}


type class1 struct {
	A interface{}
	B []int
}


func main() {
	// 创建数据集
	students := make([]student, 0)
	for i := 5; i < 7; i++ {
		students = append(students, newStudent(i, fmt.Sprintf("小明_%d", i)))
	}

	// 生成 class 数据集对象
	stu := class{
		"学生",
		students,
	}
	s, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("编码失败！")
		return
	}
	fmt.Printf("编码： %s\n", s)

	// 解码
	var c1 class
	err = json.Unmarshal(s, &c1)
	if err != nil {
		fmt.Println("c1 error = ", err.Error())
	}
	fmt.Printf("%#v\n", c1)
	fmt.Println(c1.Students[0].Name)


	// 构建错误的数据，试着解析
	strc := `{"Title":"学生","Students":[{"Id":"5","Name":5},{"Id":6,"Name":"小明_6"}]}`
	var c2 class
	err = json.Unmarshal([]byte(strc), &c2)
	if err != nil {
		fmt.Println("c2 error = ", err.Error())
	}

	fmt.Printf("%#v\n", c2)
	fmt.Println(c2.Students[0].Name)

	fmt.Println("class1.....")
	cla2 := class1{
		int8(2),
		[]int{1, 2, 3},
	}
	s, err = json.Marshal(cla2)
	if err != nil {
		fmt.Println("cla2 编码错误: error = ", err)
	}
	fmt.Println(string(s))

	// 解码
	clas := `{"A":2,"B":[1,2,3]}`
	//var a *class1  错误不能传入空指针!!!
	var a class1
	err = json.Unmarshal([]byte(clas), &a)
	if err != nil {
		fmt.Println("clas 编码错误: error = ", err)
	}
	fmt.Printf("clas = %#v\n", a)
	// 如果是 接口类型，那么这里默认将 int8 的 A 转换为了 float64。  不对应之前的数据类型。
	fmt.Println(reflect.TypeOf(a.A))
}
